#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h> 
#include<string.h>


//1 memcpy泛型拷贝函数
////返回目标空间的起始地址                        //被拷贝的字节个数
//void* memcpy(void* destination, const void* source, size_t num)
//{              //目标空间的地址       //源空间的地址 
//
//}


//void* my_memcpy(void* dest, const void* src, size_t num)
//{
//	assert(dest && src);
//	void* ret = dest;
//	for (int i = 0;i < num;i++)//while(num--)
//	{
//		*(char*)dest = *(char*)src;
//		dest = (char*)dest + 1;//(char*)dest++;//强转是临时的，到++时又不是char*了
//		src = (char*)src + 1;//++(char*)str;更紧了行，但不是所以的编译器都行
//	}
//	return ret;
//}
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[20] = { 0 };
//	//将arr1中的3 4 5 6 7 拷贝放到arr2中
//	memcpy(arr2, arr1 + 2, 20);
//	int arr3[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr4[20] = { 0 };
//	my_memcpy(arr4, arr3+2, 20);
//	int arr5[] = { 1,2,3,4,5,6,7,8,9,10 };
//	memcpy(arr5+2, arr5, 20);//12121//err
//	//memcpy不负责有重叠内存的拷贝，重叠内存的拷贝用memmove
//	return 0;
//}


//2 memmove内存拷贝函数，对重叠内存也可拷贝


////变成字节而泛型
//void* my_memmove(void* dest, const void* src, size_t num)
//{
//	assert(dest && src);
//	void* ret = dest;
//	if (dest < src)//前->后
//	{
//		while(num--)
//		{
//			*(char*)dest = *(char*)src;
//			dest = (char*)dest + 1;
//			src = (char*)src + 1;
//		}
//	}
//	else//(dest > src)//后->前
//	{
//		while (num--)
//		{
//			*((char*)dest + num) = *((char*)src + num);
//		}
//	}
//	return ret;
//}
//int main()
//{
//	int arr1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//	memmove(arr1+2, arr1, 20);
//	for (int i = 0;i < 10;i++)
//	{
//		printf("%d ", arr1[i]);
//	}
//	printf("\n");
//	int arr2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//	my_memmove(arr2+2, arr2, 20);
//	for (int i = 0;i < 10;i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}


//3 memset对内存里的字节对象设值的函数，填充内存块函数
//将内存中的值以字节为单位设置成想要的内容


//int main()
//{
//	int arr[10] = { 0 };
//	memset(arr, 1, 4);//以字节为一个个对象单位，4个字节4个对象单位
//	//ox01 01 01 01 ->第一个元素,变成16843009
//	//以字节为单位连续一块放的
//	char brr[] = "hello world";
//	//地址指向所指的是对象左侧地址如果要跳一定要掠过自己算成是一头算的开头算，指标为左侧指标领右值
//	memset(brr + 6, 'x', 5);//其实直接算指向谁就行了，指向角标0元素的+6=指向角标6元素的，指向第一个元素的+6=指向第七个元素的
//	printf("%s\n", brr);
//	return 0;
//}


//4 memcmp比较两个内存块函数


//int main()
//{
//	int a = 1;//一个整型4个byte，一个byte8个bit，一个整型32个bit，一个二进制数一个bit，4个二进制数1个十六进制数
//	//0000 0000 0000 0000 0000 0000 0000 0001 -> 一个整型的二进制
//	// 0    0    0    0    0    0    0    1 -> 00 00 00 01 -> 一个整型的十六进制
//	//在内存中把十六进制一块块从右往左取从左往右放 -> 01 00 00 00
//	//1282十六进制：00 00 05 02，在内存中 -> 02 05 00 00
//	int arr1[] = { 1,2,3,4,5 };//权       -> 10 32 54 76
//	//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
//	int arr2[] = { 1,2,3,6,5 };
//	//01 00 00 00 02 00 00 00 03 00 00 00 06 00 00 00 05 00 00 00
//	int ret = memcmp(arr1, arr2, 12);
//	printf("%d\n", ret);
//	printf("%d\n", memcmp(arr1, arr2, 16));
//	return 0;
//}